/* 
 *  PDA project -- UBS/IUT de Vannes -- Dept Informatique
 *
 *  $Id$
 *
 *  Copyright 2007-08 © IUT de Vannes
 *  Ce logiciel pédagogique est diffusé sous licence GPL
 */
package pda.ancien;

import java.io.Serializable;
import java.util.ArrayList;

/**
 * <h1>Classe AncienModel. Elle fait office de Model dans le modele MVC</h1>
 * Cette classe utilise un ArrayList (un tableau dynamique) qui comprend les activites.
 * C'est ici qu'on interagit avec la liste des activites, (ajout, suppression, recherche, etc.)
 * Elle implemente Serializable pour permettre la compilation de l'arrayList dans un fichier.obj
 * @author Mathieu Cornic
 * @author Camille Guerin
 * A rendre Jeudi 19 juin 2008
 */
public class AncienModel implements Serializable{
	
    private static final long serialVersionUID = 1L;
    ArrayList<Activite> listeDActivites;//l'array liste qui contient les activites
    ArrayList<Activite> listeUnJour;//l'arrayList qui contient les activite d'un jour precis
	
    /**
     * Constructeur de la classe AncienModel. 
     * Il initialise l'arrayList d'activites
     */
    public AncienModel () {
	listeDActivites = new ArrayList<Activite> ();
    }
	
    /**
     * Methode qui permet d'ajouter une activite a la fin de l'arrayList
     * @param activite l'activite a ajouter
     * @return vrai si l'activite a ete ajoutee, faux dans le cas contraire
     */
    public boolean ajouterActivite (Activite activite) {
		
		
	boolean peutAjouterActivite = true;//booleen qui permet de savoir si on peut ajouter une activite (vrai dans ce cas, faux dans le cas contraire)
		
	//On parcours l'arrayList d'activites
	for (int i=0; i< this.size (); i++ ) {
			
	    if (activite.compareTo (this.chercheActivite (i)) == Activite.CHEVAUCHEMENT) {
		//Si il y chevauchement entre l'activite a ajouter et une dans l'arrayList
		peutAjouterActivite = false;//Alors on ne peut pas ajouter
		return false;//et on retourn faux, l'activite n'a pas ete ajoutee
	    }
	}
	if (peutAjouterActivite) {
	    //Si on peut ajouter l'activite
	    //on ajoute l'activite a la fin de l'arrayList
	    listeDActivites.add (activite);
	    return true;//On retourne vrai, l'activite a ete ajoutee
	}
	return false;//on retourne faux, l'activite n'a pas ete ajoutee
    }
	
    /**
     * Methode qui permet savoir si on peut ajouter une activite au niveau du chevauchement
     * @param activite l'activite a modifier
     * @return vrai si on peut modifier, faux dans le cas contraire
     */
    public boolean modifierActivite (Activite activite) {
		
	boolean peutModifierActivite = true;//permet de savoir si on peut modifier l'activite
		
	//On parcours l'arrayList
	for (int i=0; i< this.size (); i++ ) {
			
	    //On ecarte le cas du chevauchement si les deux activites ont le meme id (identique)
	    //Ex: on veut deplacer une activite 12h-14h à 13h-15h
	    if (activite.getId () != chercheActivite (i).getId ()) {

		if (activite.compareTo (this.chercheActivite (i)) == Activite.CHEVAUCHEMENT) {
		    //Si les activites se chevauchent
		    peutModifierActivite = false;//on ne peut pas modifier
		    return false;
		}
			
	    }
	}
	if (peutModifierActivite) {
	    //Si on peut ajouter l'activite
	    return true;//On renvoit vrai
	}
	return false;
    }
	
	 
    /**
     * Methode qui permet de chercher une activite en fonction de sa place dans l'arrayList (cad l'iD unique de l'arrayList)
     * et de renvoyer l'activite correspondante
     * @param index la place de l'activite dans l'arrayList = id de l'activite
     * @return l'activite correspondante a sa place/a son Id
     */
    public Activite chercheActivite (int index) {
		
	return listeDActivites.get (index);
    }
	
    /**
     * Methode qui permet de supprimer une activite dans l'arrayList en fonction de son id, 
     * c'est a dire sa place dans l'arrayList
     * @param id la place de l'activite dans l'arrayList
     */
    public void supprimerActivite (int id) {
		
	listeDActivites.remove (id); 
		
	//on parcourt l'arrayList
	for (int i=0; i< this.size (); i++) {
			
	    //On va baisser l'id des activites qui suivent pour que l'id continue a etre egal a la place dans l'arrayList
	    //Si l'id de l'activite de l'arrayList est superieur a l'id de l'activite a supprimer
	    if (this.chercheActivite (i).getId () > id) {
		//alors on remplace l'id de l'activite de l'arrayList
		this.chercheActivite (i).setId (i);
	    }
	}
		
		
	System.out.println ("Activite supprimee : "+id);
		
    }

    /**
     * Méthode qui permet de vider l'arrayList et donc de vider la liste d'activites
     */
    public void supprimerTout () {
	listeDActivites.clear ();
    }

    /**
     * Methode qui permet de renvoyer l'arrayList des toutes les activites
     * @return l'arrayListe de toutes les activites
     */
    public ArrayList<Activite> getListeToutesActivites () {
		
	return listeDActivites;
		
    }

    /**
     * Methode qui permet de récuperer l'arrayList des activites suivant un jour precis dans l'annee, dans l'ordre chronologique.
     * Il permettra d'afficher les activites du jour dans l'ordre chronologique facilement.
     * Elle est séparée en deux parties. D'une part, on ajoute les activites de la date passee en parametre dans un ArrayList
     * Puis dans une autre partie, on trie par le tri par selection les activites dans cet ArrayList
     * @param jour le jour dont on veut afficher la liste des activites
     * @param mois le mois dont on veut afficher la liste des activites
     * @param annee l'annee dont on veut afficher la liste des activites
     * @return l'arrayListe qui contient les activité de la date passee en parametre
     */
    public ArrayList<Activite> getListeActiviteDuJour (int jour, int mois, int annee) {
		
	listeUnJour = new ArrayList<Activite> ();//l'arrayList qu'on retournera (il sera trié, avec seulement les activite du jour)
		
	//############# Restriction ################"
		
	//On parcours l'arrayList principal
	for (int i=0; i< this.size (); i++ ) {
	    if ( (chercheActivite (i).getJour () == jour) && (chercheActivite (i).getMois () == (mois +1)) && (chercheActivite (i).getAnnee () == annee) ) {
		//S'il ya des activites avec la date correspondante à celle passee en parametre
		//Alors on ajoute cette date a l'arrayList du jour
		listeUnJour.add (chercheActivite (i));
				
	    }
			
	}
		
	//################# Tri par selection ##################"
		
	Activite min; // valeur temporaire du pivot
	int positionMin; // position de la premiere valeur dans l'arrayList
	int size = listeUnJour.size ();//taille de l'arrayList
		
	for (int i = 0; i < size-1; i++) {
			
	    //On stocke la valeur courante et sa position dans l'arrayList
	    positionMin = i;
	    min = listeUnJour.get (i);
			
	    for (int j = i+1; j < size; j++) {
		if (listeUnJour.get (j).compareTo (min) == Activite.A_AVANT_B) {
		    //On stocke la valeur courante et sa position dans l'arrayList
		    min = listeUnJour.get (j);
		    positionMin = j;	
		}
	    }
	    //On echange la premiere valeur avec la courante
	    listeUnJour.set (positionMin, listeUnJour.get (i));
	    listeUnJour.set (i, min);
	}
		
	//############ Retour ####################
	return listeUnJour;
    }

    /**
     * Methode qui permet de recuperer la taille de l'arrayList et donc le nombre d'activites
     * @return la taille de l'arrayList
     */
    public int size () {
	return listeDActivites.size ();
    }
    
 
} // ---------------------------------------------------------- Class HelloWorld
